package com.saoma.weixin.until;

//~--- non-JDK imports --------------------------------------------------------


import net.sf.json.JSONObject;

import java.util.Date;
import java.util.TreeMap;

//~--- JDK imports ------------------------------------------------------------

//~--- classes ----------------------------------------------------------------

/**
 * Class PayOrderDemo
 * Description
 * Create 2017-04-19 15:58:31
 * @author Benny.YEE
 */
public class PayOrderDemo {

    /**
     * Method queryOrderList
     * Description 说明：
     *
     * @param outNo 说明：
     * @param pmtTag 说明：
     * @param pmtName 说明：
     * @param ordName 说明：
     * @param originalAmount 说明：
     * @param discountAmount 说明：
     * @param ignoreAmount 说明：
     * @param tradeAmount 说明：
     * @param tradeAccount 说明：
     * @param tradeNo 说明：
     * @param tradeResult 说明：
     * @param remark 说明：
     * @param authCode 说明：
     * @param tag 说明：
     * @param jumpUrl 说明：
     * @param notifyUrl 说明：
     */
    public void queryOrder(String outNo, String pmtTag, String pmtName, String ordName, Integer originalAmount,
                               Integer discountAmount, Integer ignoreAmount, Integer tradeAmount, String tradeAccount,
                               String tradeNo, String tradeResult, String remark, String authCode, String tag,
                               String jumpUrl, String notifyUrl) {

        // 初始化参数
        String timestamp = new Date().getTime() / 1000 + "";    // 时间

        try {

            // 固定参数
            TreeMap<String, String> postmap = new TreeMap<String, String>();    // 请求参数的map

            postmap.put("open_id", TestParams.OPEN_ID);
            postmap.put("timestamp", timestamp);

            TreeMap<String, String> datamap = new TreeMap<String, String>();    // data参数的map

            datamap.put("out_no", outNo);
            datamap.put("pmt_tag", pmtTag);
            datamap.put("pmt_name", pmtName);
            datamap.put("ord_name", ordName);
            datamap.put("original_amount", originalAmount+"");
            datamap.put("discount_amount", discountAmount+"");
            datamap.put("ignore_amount", ignoreAmount+"");
            datamap.put("trade_amount", tradeAmount+"");
            datamap.put("trade_account", tradeAccount);
            datamap.put("trade_no", tradeNo);
            datamap.put("trade_result", tradeResult);
            datamap.put("remark", remark);
            datamap.put("auth_code", authCode);
            datamap.put("tag", tag);
            datamap.put("jump_url", jumpUrl);
            datamap.put("notify_url", notifyUrl);

            /**
             * 1 data字段内容进行AES加密，再二进制转十六进制(bin2hex)
             */
            TLinx2Util.handleEncrypt(datamap, postmap);

            /**
             * 2 请求参数签名 按A~z排序，串联成字符串，先进行sha1加密(小写)，再进行md5加密(小写)，得到签名
             */
            TLinx2Util.handleSign(postmap);

            /**
             * 3 请求、响应
             */
            String rspStr = TLinx2Util.handlePost(postmap, TestParams.PAYORDER);
            System.out.println("====post响应字符串= " + rspStr);

            /**
             * 4 验签  有data节点时才验签
             */
            JSONObject respObject = JSONObject.fromObject(rspStr);
            Object dataStr    = respObject.get("data");

            if (!rspStr.isEmpty() && ( dataStr != null )) {
                if (TLinx2Util.verifySign(respObject)) {    // 验签成功

                    /**
                     * 5 AES解密，并hex2bin
                     */
                    String respData = TLinxAESCoder.decrypt(dataStr.toString(), TestParams.OPEN_KEY);

                    System.out.println("=================响应data内容= " + respData);
                    JSONObject jsonObject = JSONObject.fromObject(respData);
                    Object tradeQrcode = jsonObject.get("trade_qrcode");
                    System.out.println("=================支付二维码地址= " + tradeQrcode.toString());
                    System.out.println("=================trade_result= " + jsonObject.get("trade_result").toString());
                    String s1 = jsonObject.get("trade_result").toString();
                    System.out.println("=================return_code= " + JSONObject.fromObject(s1.substring(1,s1.length()-1)).get("return_code"));

                } else {
                    System.out.println("==========验签失败==========");
                }
            } else {
                System.out.println("==========没有返回data数据==========");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Method main
     * Description 说明：
     *
     * @param args 说明：
     */
    public static void main(String[] args) {
        new PayOrderDemo().queryOrder("81685228", "Cash", null, "现金支付测试1",1,
                null, null, 1,null, null, null, null,
                null, null, null, "http://local.ttg.cn:8400/tlinx2apidemo1/callback/scanpay_cashier/payResult");
    }
}


//~ Formatted by Jindent --- http://www.jindent.com
